/**
 * Generali Solutions d'assurances - Tous droits réservés &copy; 2007 - 2010
 */
package fr.generali.accueilclient.tigre.consultationsolde.utils;

import java.beans.PropertyDescriptor;

import org.apache.commons.lang.StringUtils;
import org.springframework.beans.BeanWrapper;

import fr.generali.accueilclient.tigre.consultationsolde.om.ISoldeCompteClientChezApporteur;
import fr.generali.accueilclient.tigre.consultationsolde.om.ISuiviEtatClient;
import fr.generali.accueilclient.tigre.consultationsolde.om.ITechnique;

/**
 * @author Holmes Kelly
 */
public class AccueilClientEnteteSoldeProperties {

    /**
     * Saut de ligne
     */
    private static final String SAUT_DE_LIGNE = "<br/>";

    /**
     * bean wrapper
     */
    private BeanWrapper beanWrapper;

    /**
     * @param beanWrapper bean wrapper
     */
    private AccueilClientEnteteSoldeProperties(BeanWrapper beanWrapper) {
        this.beanWrapper = beanWrapper;
    }

    /**
     * @param beanWrapper wrapper
     * @return properties entete solde
     */
    public static AccueilClientEnteteSoldeProperties getInstance(BeanWrapper beanWrapper) {

        return new AccueilClientEnteteSoldeProperties(beanWrapper);
    }

    /**
     * description element du wrapper
     */
    public String description() {

        PropertyDescriptor[] propertyDescriptors = beanWrapper.getPropertyDescriptors();

        StringBuilder descriptionEnteteConsultSolde = new StringBuilder(0);

        for (PropertyDescriptor propertyDescriptorLoc : propertyDescriptors) {

            if (propertyDescriptorLoc.getPropertyType() != null
                            && beanWrapper.isWritableProperty(propertyDescriptorLoc.getName())) {

                descriptionEnteteConsultSolde.append(StringUtils.defaultString(descriptionCodeRetour(propertyDescriptorLoc)));
                descriptionEnteteConsultSolde.append(StringUtils
                                .defaultString(descriptionSoldeCompteClientChezApporteur(propertyDescriptorLoc)));
                descriptionEnteteConsultSolde.append(StringUtils
                                .defaultString(descriptionSuiviClient(propertyDescriptorLoc)));
                descriptionEnteteConsultSolde.append(StringUtils
                                .defaultString(descriptionTechnique(propertyDescriptorLoc)));
            }
        }

        return descriptionEnteteConsultSolde.toString();

    }

    /**
     * @param propertyDescriptorLoc property descriptor
     * @return description
     */
    private String descriptionCodeRetour(PropertyDescriptor propertyDescriptorLoc) {

        StringBuilder descriptionSolde = new StringBuilder(0);

        if (propertyDescriptorLoc.getPropertyType() == String.class
                        && beanWrapper.getPropertyValue(propertyDescriptorLoc.getName()) != null
                        && StringUtils.equals(propertyDescriptorLoc.getName(), "codeRetour")) {

            descriptionSolde.append("<b>")
                            .append(propertyDescriptorLoc.getName())
                            .append("</b>")
                            .append(":")
                            .append(beanWrapper.getPropertyValue(propertyDescriptorLoc.getName()))
                            .append(SAUT_DE_LIGNE);
        }

        return descriptionSolde.toString();
    }

    /**
     * @param propertyDescriptorLoc property descriptor
     * @return description
     */
    private String descriptionSoldeCompteClientChezApporteur(PropertyDescriptor propertyDescriptorLoc) {

        StringBuilder descriptionSolde = new StringBuilder(0);

        if (propertyDescriptorLoc.getPropertyType() == ISoldeCompteClientChezApporteur.class
                        && beanWrapper.getPropertyValue(propertyDescriptorLoc.getName()) != null
                        && StringUtils.equals(propertyDescriptorLoc.getName(), "soldeClientTotalPourIntermediaire")) {
            descriptionSolde.append("<b>")
                            .append(propertyDescriptorLoc.getName())
                            .append("</b>")
                            .append(":")
                            .append(SAUT_DE_LIGNE)
                            .append("soldeConfie")
                            .append(":")
                            .append(beanWrapper.getPropertyValue("soldeClientTotalPourIntermediaire.soldeConfie.value"))
                            .append(beanWrapper.getPropertyValue("soldeClientTotalPourIntermediaire.soldeConfie.unit"))
                            .append(SAUT_DE_LIGNE)
                            .append("soldePreleve")
                            .append(":")
                            .append(beanWrapper
                                            .getPropertyValue("soldeClientTotalPourIntermediaire.soldePreleve.value"))
                            .append(beanWrapper.getPropertyValue("soldeClientTotalPourIntermediaire.soldePreleve.unit"))
                            .append(SAUT_DE_LIGNE)
                            .append("soldeTotal")
                            .append(":")
                            .append(beanWrapper.getPropertyValue("soldeClientTotalPourIntermediaire.soldeTotal.value"))
                            .append(beanWrapper.getPropertyValue("soldeClientTotalPourIntermediaire.soldeTotal.unit"))
                            .append(SAUT_DE_LIGNE)
                            .append("soldeNonPreleve")
                            .append(":")
                            .append(beanWrapper
                                            .getPropertyValue("soldeClientTotalPourIntermediaire.soldeNonPreleve.value"))
                            .append(beanWrapper
                                            .getPropertyValue("soldeClientTotalPourIntermediaire.soldeNonPreleve.unit"))
                            .append(SAUT_DE_LIGNE)
                            .append("identifiantPersonneClient")
                            .append(":")
                            .append(beanWrapper
                                            .getPropertyValue("soldeClientTotalPourIntermediaire.identifiantPersonneClient"))
                            .append(SAUT_DE_LIGNE)
                            .append("identifiantApporteur")
                            .append(":")
                            .append(beanWrapper
                                            .getPropertyValue("soldeClientTotalPourIntermediaire.identifiantApporteur"))
                            .append(SAUT_DE_LIGNE);

        }

        if (propertyDescriptorLoc.getPropertyType() == ISoldeCompteClientChezApporteur.class
                        && beanWrapper.getPropertyValue(propertyDescriptorLoc.getName()) != null
                        && StringUtils.equals(propertyDescriptorLoc.getName(), "soldeClientHorsGroupePourIntermediaire")) {

            descriptionSolde.append("<b>")
                            .append(propertyDescriptorLoc.getName())
                            .append("</b>")
                            .append(":")
                            .append(SAUT_DE_LIGNE)
                            .append("soldeConfie")
                            .append(":")
                            .append(beanWrapper
                                            .getPropertyValue("soldeClientHorsGroupePourIntermediaire.soldeConfie.value"))
                            .append(beanWrapper
                                            .getPropertyValue("soldeClientHorsGroupePourIntermediaire.soldeConfie.unit"))
                            .append(SAUT_DE_LIGNE)
                            .append("soldePreleve")
                            .append(":")
                            .append(beanWrapper
                                            .getPropertyValue("soldeClientHorsGroupePourIntermediaire.soldePreleve.value"))
                            .append(beanWrapper
                                            .getPropertyValue("soldeClientHorsGroupePourIntermediaire.soldePreleve.unit"))
                            .append(SAUT_DE_LIGNE)
                            .append("soldeTotal")
                            .append(":")
                            .append(beanWrapper
                                            .getPropertyValue("soldeClientHorsGroupePourIntermediaire.soldeTotal.value"))
                            .append(beanWrapper
                                            .getPropertyValue("soldeClientHorsGroupePourIntermediaire.soldeTotal.unit"))
                            .append(SAUT_DE_LIGNE)
                            .append("soldeNonPreleve")
                            .append(":")
                            .append(beanWrapper
                                            .getPropertyValue("soldeClientHorsGroupePourIntermediaire.soldeNonPreleve.value"))
                            .append(beanWrapper
                                            .getPropertyValue("soldeClientHorsGroupePourIntermediaire.soldeNonPreleve.unit"))
                            .append(SAUT_DE_LIGNE)
                            .append("identifiantPersonneClient")
                            .append(":")
                            .append(beanWrapper
                                            .getPropertyValue("soldeClientHorsGroupePourIntermediaire.identifiantPersonneClient"))
                            .append(SAUT_DE_LIGNE)
                            .append("identifiantApporteur")
                            .append(":")
                            .append(beanWrapper
                                            .getPropertyValue("soldeClientHorsGroupePourIntermediaire.identifiantApporteur"))
                            .append(SAUT_DE_LIGNE);
        }

        if (propertyDescriptorLoc.getPropertyType() == ISoldeCompteClientChezApporteur.class
                        && beanWrapper.getPropertyValue(propertyDescriptorLoc.getName()) != null
                        && StringUtils.equals(propertyDescriptorLoc.getName(), "soldeClientViePourintermediaire")) {

            descriptionSolde.append("<b>")
                            .append(propertyDescriptorLoc.getName())
                            .append("</b>")
                            .append(":")
                            .append(SAUT_DE_LIGNE)
                            .append("soldeConfie")
                            .append(":")
                            .append(beanWrapper.getPropertyValue("soldeClientViePourintermediaire.soldeConfie.value"))
                            .append(beanWrapper.getPropertyValue("soldeClientViePourintermediaire.soldeConfie.unit"))
                            .append(SAUT_DE_LIGNE)
                            .append("soldePreleve")
                            .append(":")
                            .append(beanWrapper.getPropertyValue("soldeClientViePourintermediaire.soldePreleve.value"))
                            .append(beanWrapper.getPropertyValue("soldeClientViePourintermediaire.soldePreleve.unit"))
                            .append(SAUT_DE_LIGNE)
                            .append("soldeTotal")
                            .append(":")
                            .append(beanWrapper.getPropertyValue("soldeClientViePourintermediaire.soldeTotal.value"))
                            .append(beanWrapper.getPropertyValue("soldeClientViePourintermediaire.soldeTotal.unit"))
                            .append(SAUT_DE_LIGNE)
                            .append("soldeNonPreleve")
                            .append(":")
                            .append(beanWrapper
                                            .getPropertyValue("soldeClientViePourintermediaire.soldeNonPreleve.value"))
                            .append(beanWrapper
                                            .getPropertyValue("soldeClientViePourintermediaire.soldeNonPreleve.unit"))
                            .append(SAUT_DE_LIGNE)
                            .append("identifiantPersonneClient")
                            .append(":")
                            .append(beanWrapper
                                            .getPropertyValue("soldeClientViePourintermediaire.identifiantPersonneClient"))
                            .append(SAUT_DE_LIGNE)
                            .append("identifiantApporteur")
                            .append(":")
                            .append(beanWrapper
                                            .getPropertyValue("soldeClientViePourintermediaire.identifiantApporteur"))
                            .append(SAUT_DE_LIGNE);
        }

        return descriptionSolde.toString();

    }

    /**
     * @param propertyDescriptorLoc property descriptor
     * @return description
     */
    private String descriptionSuiviClient(PropertyDescriptor propertyDescriptorLoc) {

        StringBuilder descriptionSolde = new StringBuilder(0);

        if (propertyDescriptorLoc.getPropertyType() == ISuiviEtatClient.class
                        && beanWrapper.getPropertyValue(propertyDescriptorLoc.getName()) != null
                        && StringUtils.equals(propertyDescriptorLoc.getName(), "suiviClient")) {
            descriptionSolde.append("<b>").append(propertyDescriptorLoc.getName()).append("</b>").append(":")
                            .append(SAUT_DE_LIGNE).append("indicateurDevise").append(":")
                            .append(beanWrapper.getPropertyValue("suiviClient.indicateurDevise")).append(SAUT_DE_LIGNE)
                            .append("indicateurHorsGestion").append(":")
                            .append(beanWrapper.getPropertyValue("suiviClient.indicateurHorsGestion"))
                            .append(SAUT_DE_LIGNE).append("indicateurContentieux").append(":")
                            .append(beanWrapper.getPropertyValue("suiviClient.indicateurContentieux"))
                            .append(SAUT_DE_LIGNE);

        }

        return descriptionSolde.toString();

    }

    /**
     * @param propertyDescriptorLoc property descriptor
     * @return description
     */
    private String descriptionTechnique(PropertyDescriptor propertyDescriptorLoc) {

        StringBuilder descriptionSolde = new StringBuilder(0);

        if (propertyDescriptorLoc.getPropertyType() == ITechnique.class
                        && beanWrapper.getPropertyValue(propertyDescriptorLoc.getName()) != null
                        && StringUtils.equals(propertyDescriptorLoc.getName(), "infosTechnique")) {
            descriptionSolde.append("<b>").append(propertyDescriptorLoc.getName()).append("</b>").append(":")
                            .append(SAUT_DE_LIGNE).append("dateMajFourmi").append(":")
                            .append(beanWrapper.getPropertyValue("infosTechnique.dateMajFourmi"))
                            .append(SAUT_DE_LIGNE).append("dateMajTigre").append(":")
                            .append(beanWrapper.getPropertyValue("infosTechnique.dateMajTigre"))
                            .append(SAUT_DE_LIGNE);

        }

        return descriptionSolde.toString();

    }

}
